#pragma once

#include <iostream>
#include <string>

#define Die(code)   \
    do              \
    {               \
        exit(code); \
    } while (0)

#define CONV(v) (struct sockaddr *)(v)

enum
{
    USAGE_ERR = 1,
    SOCKET_ERR,
    BIND_ERR,
    LISTEN_ERR
};

const int gdefaultsockfd = -1;
const int gbacklog = 8;



bool ParseOneLine(std::string &req_str,std::string *out,const std::string& sep)
{
    auto pos=req_str.find(sep);
    //找不到？找到
    if(pos==std::string::npos)
    {
        //找不到
        return false;
    }

    //找到了，说明这个请求行完整，但是你无法保证后面的请求报头与正文的完整
    *out=req_str.substr(0,pos);
    req_str.erase(0,pos+sep.size());
    return true;
}

bool SplitString(const std::string &header,const std::string &sep,std::string*key,std::string *value)
{
    //我们这里传递sep参数的原因是想实现一个模板，我们这个函数会根据传进的符号不同来进行分离。
    //因为我们的key:value分离的依据是中间的:
    //如果这个：变了，我们也只需要传递参数改变，就能继续正确分离了
    auto pos=header.find(sep);
    if(pos==std::string::npos)//没找到分隔符
    {
        return false;
    }
    *key=header.substr(0,pos);
    *value=header.substr(pos+sep.size());
    return true;
}